# 导入所需的库
import pymysql  # MySQL数据库连接库
from movie_dao import MovieDAO  # 导入电影数据访问对象
import logging  # 日志模块
import re  # 正则表达式模块，用于数据清洗

# 配置日志系统
logging.basicConfig(level=logging.INFO,  # 设置日志级别为INFO
                   format='%(asctime)s - %(levelname)s - %(message)s')  # 设置日志格式：时间-级别-消息
logger = logging.getLogger(__name__)  # 获取当前模块的日志记录器

class YearLineDAO:
    """年份分布数据访问对象，用于处理电影年份的统计和分布"""
    
    def __init__(self):
        """初始化年份DAO对象"""
    # 复用 MovieDAO 的数据库配置
        self.movie_dao = MovieDAO()  # 创建电影DAO实例用于数据库连接

    def get_year_distribution(self):
        """
        获取年份分布数据，提前做数据清洗，确保year字段为4位数字且合理
        :return: 包含年份列表和对应电影数量的字典
        """
        conn = None  # 数据库连接对象
        cursor = None  # 数据库游标对象
        try:
            conn = self.movie_dao.get_connection()  # 获取数据库连接
            cursor = conn.cursor(pymysql.cursors.DictCursor)  # 创建返回字典格式数据的游标
            
            # SQL查询：统计每年的电影数量
            sql = """
                SELECT year, COUNT(*) as count  # 选择年份和电影数量
                FROM movies  # 从电影表中查询
                WHERE year IS NOT NULL AND year != ''  # 过滤掉空值
                GROUP BY year  # 按年份分组
                ORDER BY year  # 按年份排序
            """
            cursor.execute(sql)  # 执行SQL查询
            results = cursor.fetchall()  # 获取所有查询结果
            logger.info(f"SQL查询结果: {results}")  # 记录查询结果
            
            # 数据清洗：只保留4位数字的年份，且在合理范围（1900-2100）
            years = []  # 存储清洗后的年份列表
            data = []  # 存储对应的电影数量
            for row in results:  # 遍历查询结果
                year_str = str(row['year']).strip()  # 将年份转换为字符串并去除空格
                if re.fullmatch(r'\d{4}', year_str):  # 使用正则表达式检查是否为4位数字
                    year_int = int(year_str)  # 转换为整数
                    if 1900 <= year_int <= 2100:  # 检查年份是否在合理范围内
                        years.append(year_str)  # 添加年份到列表
                        data.append(int(row['count']))  # 添加对应的电影数量
            
            logger.info(f"最终返回的年份分布数据: years={years}, data={data}")  # 记录最终结果
            return {"years": years, "data": data}  # 返回年份分布数据
            
        except Exception as e:  # 捕获所有可能的异常
            logger.error(f"获取年份分布数据时出错: {str(e)}")  # 记录错误信息
            logger.exception("详细错误信息:")  # 记录详细的异常堆栈
            return {"years": [], "data": []}  # 发生错误时返回空数据
            
        finally:  # 确保资源正确释放
            if cursor:  # 如果游标已创建
                cursor.close()  # 关闭数据库游标
            if conn:  # 如果连接已创建
                conn.close()  # 关闭数据库连接